凡事不怕一萬,只怕萬一,不管小災害,大災難,有個備份總是可以做補救,備份可以從2個部分下手,資源配置(Resource Configuration)及ECTD
簡單暴力,取得建立資源所需的yaml檔案,最初建立object的時候,分有命令式(imeperative)及敘述式(declarative),復原時,利用此些配置檔重建objects
kubectl get all -all-namespace -o yaml > all-deploy-services.yaml
,另外也能使用外部解決方案,像是Velero、Stash、Portworx等工具,透過K8s的API將資源悉數匯出儲存有關叢集內的所有object的資訊及各類狀態等,因此可以先考慮備份etcd
備份
--data-dir=/var/lib/etcd
,是data的存放地(目錄),將此目錄及其資料進行備份ETCDCTL_API=3 etcdctl snapshot save snapshot.db
ls
ETCDCTL_API=3 etcdctl snapshot status snapshot.db
復原
當etcd還原時,初始化新的cluster設定,將etcd作為新成員加入,避免加入既存的cluster
復原etcd的大流程
ETCDCTL_API=3 etcdctl \
snapshot restore snapshot.db \
--data-dir /var/lib/etcd-from-backup \ # 設定目錄為先前的備份目錄
--initial-cluster master-1=https://192.168.5.11:2380,master-2=https://192.168.5.12:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-advertise-peer-urls https://${INTERNAL_IP}:2380
# 指定驗證
ETCDCTL_API=3 etcdctl snapshot save snapshot.db
--endpoints=https://127.0.0.1:2379
--cacert=/etc/etcd/ca.crt
--cert=/etc/etcd/etcd server.crt
--key=/etc/etcd/etcd server.key
因為復原作業會重啟etcd,而api-server依賴etcd,因此需執行下面的重新載入指令
systemctl daemon-reload
service etcd restart
service kube-apiserver start
p.s. etcd version: 3.5.x後的版本已棄用etcdctl,改用etcdutl復原